def create_failure_message(test_results, responsible_person=None):
    """创建失败用例的详细消息"""
    total = test_results['total']
    failed = test_results['failed']
    passed = test_results['passed']

    # 基础信息
    content = f"🚨 自动化测试执行完成，发现 {failed} 个失败用例\n\n"
    content += f"📊 测试概览:\n"
    content += f"- 总用例数: {total}\n"
    content += f"- 通过数: {passed}\n"
    content += f"- 失败数: {failed}\n"
    content += f"- 跳过数: {test_results.get('skipped', 0)}\n\n"

    # 失败用例详情
    if failed > 0 and 'failure_details' in test_results:
        content += "❌ 失败用例详情:\n"
        for i, detail in enumerate(test_results['failure_details'][:5], 1):  # 最多显示5个失败用例
            content += f"{i}. {detail['test_case']}\n"
            content += f"   错误: {detail['error'][:100]}...\n\n"

        if failed > 5:
            content += f"... 还有 {failed - 5} 个失败用例未显示\n\n"

    # @责任人[5](@ref)
    if responsible_person:
        content += f"@{responsible_person} "

    content += "请及时处理失败用例！"

    return content


import subprocess
import os


def run_tests_with_retry(max_retries=3):
    """运行测试并重跑失败用例"""
    # 第一次运行测试
    print("开始第一次测试运行...")
    result = run_tests()

    # 重跑失败用例
    for retry_count in range(1, max_retries + 1):
        if result['failed'] == 0:
            print("所有用例通过，无需重跑")
            break

        print(f"开始第 {retry_count} 次重跑失败用例...")

        # 使用pytest的rerun功能重跑失败用例[1](@ref)
        rerun_result = rerun_failed_tests()

        # 更新结果统计
        if rerun_result:
            result['passed'] += rerun_result['recovered']  # 重跑后通过的用例
            result['failed'] = rerun_result['still_failed']  # 仍然失败的用例
            result['total_retries'] = retry_count

            print(f"重跑后结果: 通过 {result['passed']}, 失败 {result['failed']}")

    return result


def rerun_failed_tests():
    """使用pytest重跑失败用例[1](@ref)"""
    try:
        # 使用pytest --lf 只运行上次失败的用例
        cmd = [
            'python', '-m', 'pytest',
            '--lf',  # 只运行上次失败的用例
            '--tb=short',
            '-v'
        ]

        result = subprocess.run(cmd, capture_output=True, text=True)

        # 解析重跑结果（这里需要根据实际输出格式调整）
        return {
            'recovered': 0,  # 需要根据实际解析结果设置
            'still_failed': 0  # 需要根据实际解析结果设置
        }
    except Exception as e:
        print(f"重跑失败用例时出错: {e}")
        return None
